package com.sweet.page;

import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Getter;

import java.util.List;

/**
 * 数据分页封装类
 *
 * @param <T>
 * @author limi
 * @version 2015-07-29
 */
@Getter
public final class Page<T> implements java.io.Serializable {
    private static final long serialVersionUID = 1L;

    /**
     * 当前页码,范围>=1
     */
    @JsonProperty("number")
    private int number;

    /**
     * 当前每页数据量,范围>=1
     */
    @JsonProperty("size")
    private int size;

    /**
     * 数据总数
     */
    @JsonProperty("total_element")
    private int totalElements;

    /**
     * 分页页数,范围>=0
     */
    @JsonProperty("total_page")
    private int totalPages;

    /**
     * 当前页码的数据
     */
    @JsonProperty("content")
    private List<T> content;

    /**
     * 默认分页封装
     *
     * @param pageable      分页信息
     * @param totalElements 数据总数
     */
    public Page(Pageable pageable, int totalElements) {
        // 1.设置数据总数
        this.totalElements = totalElements;

        // 2.检查并重置每页显示量
        resetPageSize(pageable.getSize());

        // 3.检查并定义分页页数
        resetPageCount();

        // 4.检查并重置当前页码
        restePageNum(pageable.getNumber());
    }

    /**
     * 默认分页封装
     *
     * @param pageable 分页信息
     * @param total    数据总数
     * @param datas    数据
     */
    public Page(Pageable pageable, int total, List<T> datas) {
        this(pageable, total);
        this.setContent(datas);
    }

    /**
     * 合理化当前页码
     *
     * @param pageNumber
     */
    private void restePageNum(int pageNumber) {
        this.number = definePageNum(pageNumber, this.totalPages);
    }

    /**
     * 合理化当前页码,范围>=1
     *
     * @param pageNum   当前页码
     * @param pageCount 总分页页数
     * @return
     */
    private int definePageNum(int pageNum, int pageCount) {
        // 页码最小从1开始
        if (pageNum < 1) {
            return 1;
        }

        // 若总页数不足2页，则页码为1
        if (pageCount <= 1) {
            return 1;
        }

        // 当前页码大于总页数，则设置为总页数
        if (pageNum > pageCount) {
            return pageCount;
        }

        return pageNum;
    }

    /**
     * 合理化每页数据量
     *
     * @param pageSize
     */
    private void resetPageSize(int pageSize) {
        this.size = pageSize < 1 ? 1 : pageSize;
    }

    /**
     * 合理化分页页数
     */
    private void resetPageCount() {
        this.totalPages = PageUtil.getPageCount(this.totalElements, this.size);
    }

    /**
     * 填充分页数据
     *
     * @param datas
     */
    public void setContent(List<T> datas) {
        this.content = datas;
    }
}